/*
 * @Author: your name
 * @Date: 2021-08-28 10:20:18
 * @LastEditTime: 2022-03-05 14:54:59
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /hoo-front-h5-web/src/libs/axios/index.js
 */
// import axios from 'axios'
import qs from "qs";
// eslint-disable-next-line no-unused-vars
import { getStorage, setStorage } from "@/libs/utils/storage";

import { Toast as toast } from "vant";

// 记录和显示错误
function errorLog (err) {
  // 弹窗提示，具体可自定义
  if(err?.message) {
    toast(err.message)
  }
}
/**
 * 设置全局 axios 默认值
 */
// axios.defaults.baseURL = process.env.VUE_APP_BASEURL
// axios.defaults.timeout = 15 * 1000; // 超时设定
// 创建axios实例，如果有其他配置不同的，可重新设置一个实例
const instance = axios.create({
  baseURL: process.env.VUE_APP_BASEURL,
  timeout: 15000,
});
/**
 * 请求拦截器（过滤请求）
 */
instance.interceptors.request.use(
  (config) => {
    // 自定义请求头, 设置header
    config.headers.token = getStorage("token"); // token设置
    // config.headers.timestamp = String(new Date().getTime())
    // config.headers.deviceCode = String(new Date().getTime()) // 用户设备号
    // config.headers.deviceType = 0 // 设备系统类型 0.安卓 1.iOS 2.微信小程序
    return config;
  },
  (error) => {
    // 发送失败
    console.log(error);
    return Promise.reject(error);
  }
);

/**
 * 响应拦截器（过滤响应）
 */
instance.interceptors.response.use(
  (response) => {
    // dataAxios 是 axios 返回数据中的 data
    const dataAxios = response.data;
    // 这个状态码是和后端约定的
    const { code } = dataAxios;
    // 根据 code 进行判断
    if (code === undefined) {
        // 如果没有 code 代表这不是项目后端开发的接口
        return dataAxios;
    } else {
        // 有 code 代表这是一个后端接口 可以进行进一步的判断
        switch (code) {
        case 1:
            // [ 示例 ] code ===1 代表没有错误
            // return dataAxios.data;
          break;
        case '-999':
          // [ 示例 ] 其它和后台约定的 999
          setStorage("token", "");
          toast("登录已过期");
          break;
        case 'xxx':
            // [ 示例 ] 其它和后台约定的 code
            break;
        default:
            // 不是正确的 code
            break;
        }
        return dataAxios.data;
    }
  },
  (error) => {
    if (error && error.response) {
      switch (error.response.status) {
      case 400: error.message = '请求错误'; break;
      case 401: error.message = '未授权，请登录'; break;
      case 403: error.message = '拒绝访问'; break;
      case 404: error.message = `请求地址出错: ${error.response.config.url}`; break;
      case 408: error.message = '请求超时'; break;
      case 500: error.message = '服务器内部错误'; break;
      case 501: error.message = '服务未实现'; break;
      case 502: error.message = '网关错误'; break;
      case 503: error.message = '服务不可用'; break;
      case 504: error.message = '网关超时'; break;
      case 505: error.message = 'HTTP版本不受支持'; break;
      default: break;
      }
  }
    return Promise.reject(error);
  }
);

/**
 * 封装GET请求
 * @param {String}  url            请求url地址
 * @param {Object}  params        请求参数
 * @param {Boolean} showErrorMsg  接口错误自动提示
 * @param {Object}  headers       自定义单独header参数
 */
export const getRequest = (url, params, showErrorMsg = true, headers = {},) => {
  return new Promise((resolve, reject) => {
    instance({
      method: "get",
      url,
      params,
      headers: headers,
    })
      .then((res) => {
        resolve(res.data);
      })
      .catch((error) => {
        if(showErrorMsg) {
          if(error?.message) {
            errorLog(error?.message)
          }
        }
        reject(error.data);
      });
  });
};

/**
 * 封装POST请求
 * @param {String} url            请求url地址
 * @param {Object} params         请求参数
 * @param {Boolean} showErrorMsg  接口错误自动提示
 * @param {Object}  headers       自定义单独header参数
 * @param {Boolean} isJSONType    是否json格式
 */
// 表单提交或上传文件的常用的资源类型：application/x-www-form-urlencoded, multipart/form-data, application/json, application/xml 等。
// POST提交数据有两种数据传输方式，这两种方式浏览器是通过Content-Type来进行区分，如果是 application/x-www-form-urlencoded的话，则为formdata方式，如果是application/json或multipart/form-data的话，则为 request payload。
// 如果使用的qs进行序列化，（注：qs.stringify()将对象序列化成URL的形式，以&进行拼接。安装axios即可使用qs。）
// 那么content-type就是application/x-www-form-urlencoded
// 也就是常说的表单提交，传输的样式是formdata
export const postRequest = (url, params, showErrorMsg = true, isJSONType = true, headers = {
  // 'content-type': 'application/x-www-form-urlencoded' // 这里可以设置content-type来处理不同类型
}) => {
  return new Promise((resolve, reject) => {
    instance({
      method: "post",
      url,
      data: isJSONType ? qs.stringify(params) : params,
      headers,
    })
      .then((res) => {
        resolve(res.data);
      })
      .catch((error) => {
        if(showErrorMsg) {
          if(error?.message) {
            errorLog(error?.message)
          }
        }
        reject(error.data);
      });
  });
};

// /**
//  * 封装PUT请求
//  * @param {String} url          请求url地址
//  * @param {Object} params       请求参数
//  * @param {Object} headers      请求头
//  * @param {Boolean} isJSONType  是否json格式
//  */
// export const putRequest = (url, params, headers = {}) => {
//   return new Promise((resolve, reject) => {
//     instance({
//       method: "put",
//       url,
//       data: params,
//       headers,
//     })
//       .then((res) => {
//         resolve(res.data);
//       })
//       .catch((err) => {
//         reject(err.data);
//       });
//   });
// };

// /**
//  * 封装DELETE请求
//  * @param {String} url          请求url地址
//  * @param {Object} params       请求参数
//  */
// export const deleteRequest = (url, params, headers) => {
//   return new Promise((resolve, reject) => {
//     instance({
//       method: "delete",
//       url,
//       params,
//       headers,
//     })
//       .then((res) => {
//         resolve(res.data);
//       })
//       .catch((err) => {
//         reject(err.data);
//       });
//   });
// };

// /**
//  * 封装文件上传请求
//  * @param {String} url          请求url地址
//  * @param {Object} params       请求参数
//  */
// export const uploadFileRequest = (url, params) => {
//   return new Promise((resolve, reject) => {
//     instance({
//       method: "post",
//       url,
//       params,
//     })
//       .then((res) => {
//         resolve(res.data);
//       })
//       .catch((err) => {
//         reject(err.data);
//       });
//   });
// };
export default instance;
